#include "Shape.h"

void Shape::getIntegerDirection(int &x, int &y)
{
	int flagX, flagY;
	flagX = flagY = 0;
	
	if(isDirX(abs(m_sumDirX))){
		flagX = int(m_sumDirX);
		if(m_sumDirX > 0) m_sumDirX = m_sumDirX - 1 + m_dirX;
		else if(m_sumDirX < 0) m_sumDirX = m_sumDirX + 1 + m_dirX; 
	}
	
	else m_sumDirX = m_sumDirX + m_dirX;

	if(isDirY(abs(m_sumDirY))){
        flagY = int(m_sumDirY);
		if(m_sumDirY > 0)  m_sumDirY = m_sumDirY - 1 + m_dirY;
		else if(m_sumDirY < 0) m_sumDirY = m_sumDirY + 1 + m_dirY; 
	}

	else m_sumDirY = m_sumDirY + m_dirY;

	x  = flagX;
	y  = flagY;

	m_prevDirX = flagX;
	m_prevDirY = flagY;
}


void Shape::getPrevDirection(int &x, int &y)
{
	x = m_prevDirX;
	y= m_prevDirY;
}


void Shape::getIntegerDirectionExplicitly(int &dirX, int &dirY)
{
	dirX = int(m_sumDirX);
	dirY = int(m_sumDirY);
}

bool Shape::isDirX(float x)
{
	if (x >= 1)
	{
		return true;
	}
	
	return false;
}


bool Shape::isDirY(float y)
{
	if (y >= 1)
	{
			return true;
	}
	
	return false;
}

void Shape::getOriginalDirection(float &x, float &y)
{
	x = m_dirX;
	y = m_dirY;
}


void Shape::resetDirectionX()
{
	if(m_sumDirX > 0) m_sumDirX = -1;
	else if(m_sumDirX < 0) m_sumDirX = 1;
	m_dirX = -m_dirX;
}

void Shape::resetDirectionY()
{

	if(m_sumDirY > 0) m_sumDirY = -1;
	else if(m_sumDirY < 0) m_sumDirY = 1;
	m_dirY = -m_dirY;
}



void Shape::setMove(float x, float y)
{
	m_dirX = m_sumDirX = x;
	m_dirY = m_sumDirY = y;
}

void Shape::writeToBin(ofstream & outf)
{

	//MAP:
	/*
	typeinfo- dirx- diry - symb
	LEN TYPE FLOAT FLOAT - char


	/*
		char m_symb;
	float m_dirX, m_dirY, m_sumDirX, m_sumDirY;
	int m_prevDirX, m_prevDirY;

	*/
	string typeID = getType();
	int len = typeID.length();
	char * typeData = (char*)typeID.data();
	char symb = getSymbol();
	outf.write(reinterpret_cast<char*>(&len), sizeof(int));
	outf.write(typeData, len);
	
	//write shape's datamembers
	
	float dirX = this->getDirX();
	float dirY = this->getDirY();
	
	outf.write(reinterpret_cast<char*>( &m_dirX ), sizeof(float));
	outf.write(reinterpret_cast<char*>( &m_dirY ), sizeof(float));
	
	outf.write(reinterpret_cast<char*>(&symb), sizeof(char));
	
}

void Shape::readFromBinFile(ifstream & infile)
{
	float newDirX, newDirY;
	char newSymb;

	//read shape's datamembers
	infile.read(reinterpret_cast<char*>( &newDirX ), sizeof(float));
	infile.read(reinterpret_cast<char*>( &newDirY ), sizeof(float));
	infile.read(reinterpret_cast<char*>( &newSymb), sizeof(char));
	
	this->setSymbol(newSymb);
	this->setDirX(newDirX);
	this->setDirY(newDirY);
	
}
void Shape::writeToText(ofstream & outf)
{
	outf	<< (char*)getType().data() << '\n'
			<< m_dirX  << '\n'
			<< m_dirY  << '\n'
			<< m_symb << '\n';
}


void Shape::readFromText(ifstream &file)
{
	
	float newDirX, newDirY;
	char newSymb;
	string temp;
	
	//read shape's datamembers

	file >> newDirX;
	file >> newDirY;
	file >> newSymb;
	
	//
	this->setDirX(newDirX);
	this->setDirY(newDirY);
	this->setSymbol(newSymb);
	
	
}